// nodemailer 模块中文API封装 - 用于邮件发送功能
let nodemailer;
try {
  nodemailer = require('nodemailer');
} catch (e) {
  console.warn('警告: 未安装 nodemailer 库，请运行 "npm install nodemailer" 来安装');
}

/**
 * 验证nodemailer库是否已安装
 * @returns {boolean} 库是否可用
 */
function 验证Nodemailer库() {
  if (!nodemailer) {
    throw new Error('未安装 nodemailer 库，请运行 "npm install nodemailer" 来安装');
  }
  return true;
}

/**
 * 创建SMTP邮件传输器
 * @param {Object} 配置 - SMTP配置信息
 * @returns {Object} 邮件传输器
 */
function 创建SMTP传输器(配置) {
  验证Nodemailer库();
  return nodemailer.createTransport(配置);
}

/**
 * 创建Gmail邮件传输器
 * @param {string} 用户名 - Gmail用户名
 * @param {string} 密码 - Gmail密码或应用专用密码
 * @param {Object} 额外配置 - 额外的SMTP配置
 * @returns {Object} Gmail邮件传输器
 */
function 创建Gmail传输器(用户名, 密码, 额外配置 = {}) {
  验证Nodemailer库();
  return nodemailer.createTransport({
    service: 'gmail',
    auth: {
      user: 用户名,
      pass: 密码
    },
    ...额外配置
  });
}

/**
 * 创建QQ邮件传输器
 * @param {string} 用户名 - QQ邮箱用户名
 * @param {string} 授权码 - QQ邮箱授权码
 * @param {Object} 额外配置 - 额外的SMTP配置
 * @returns {Object} QQ邮件传输器
 */
function 创建QQ邮箱传输器(用户名, 授权码, 额外配置 = {}) {
  验证Nodemailer库();
  return nodemailer.createTransport({
    host: 'smtp.qq.com',
    port: 465,
    secure: true,
    auth: {
      user: 用户名,
      pass: 授权码
    },
    ...额外配置
  });
}

/**
 * 创建163邮箱传输器
 * @param {string} 用户名 - 163邮箱用户名
 * @param {string} 授权码 - 163邮箱授权码
 * @param {Object} 额外配置 - 额外的SMTP配置
 * @returns {Object} 163邮箱传输器
 */
function 创建163邮箱传输器(用户名, 授权码, 额外配置 = {}) {
  验证Nodemailer库();
  return nodemailer.createTransport({
    host: 'smtp.163.com',
    port: 465,
    secure: true,
    auth: {
      user: 用户名,
      pass: 授权码
    },
    ...额外配置
  });
}

/**
 * 创建Outlook/Hotmail传输器
 * @param {string} 用户名 - Outlook用户名
 * @param {string} 密码 - Outlook密码
 * @param {Object} 额外配置 - 额外的SMTP配置
 * @returns {Object} Outlook邮件传输器
 */
function 创建Outlook传输器(用户名, 密码, 额外配置 = {}) {
  验证Nodemailer库();
  return nodemailer.createTransport({
    host: 'smtp-mail.outlook.com',
    port: 587,
    secure: false,
    auth: {
      user: 用户名,
      pass: 密码
    },
    ...额外配置
  });
}

/**
 * 发送基本文本邮件
 * @param {Object} 传输器 - 邮件传输器对象
 * @param {string} 发件人 - 发件人邮箱
 * @param {string|Array} 收件人 - 收件人邮箱或邮箱数组
 * @param {string} 主题 - 邮件主题
 * @param {string} 内容 - 邮件正文内容
 * @param {Object} 额外选项 - 额外的邮件选项
 * @returns {Promise<Object>} 发送结果
 */
async function 发送文本邮件(传输器, 发件人, 收件人, 主题, 内容, 额外选项 = {}) {
  验证Nodemailer库();
  
  const 邮件选项 = {
    from: 发件人,
    to: 收件人,
    subject: 主题,
    text: 内容,
    ...额外选项
  };
  
  return await 传输器.sendMail(邮件选项);
}

/**
 * 发送HTML邮件
 * @param {Object} 传输器 - 邮件传输器对象
 * @param {string} 发件人 - 发件人邮箱
 * @param {string|Array} 收件人 - 收件人邮箱或邮箱数组
 * @param {string} 主题 - 邮件主题
 * @param {string} HTML内容 - HTML格式的邮件正文
 * @param {string} 文本替代 - 纯文本替代内容
 * @param {Object} 额外选项 - 额外的邮件选项
 * @returns {Promise<Object>} 发送结果
 */
async function 发送HTML邮件(传输器, 发件人, 收件人, 主题, HTML内容, 文本替代 = '', 额外选项 = {}) {
  验证Nodemailer库();
  
  const 邮件选项 = {
    from: 发件人,
    to: 收件人,
    subject: 主题,
    html: HTML内容,
    text: 文本替代,
    ...额外选项
  };
  
  return await 传输器.sendMail(邮件选项);
}

/**
 * 发送带附件的邮件
 * @param {Object} 传输器 - 邮件传输器对象
 * @param {string} 发件人 - 发件人邮箱
 * @param {string|Array} 收件人 - 收件人邮箱或邮箱数组
 * @param {string} 主题 - 邮件主题
 * @param {string} 内容 - 邮件正文内容
 * @param {Array} 附件列表 - 附件配置数组
 * @param {Object} 额外选项 - 额外的邮件选项
 * @returns {Promise<Object>} 发送结果
 */
async function 发送带附件邮件(传输器, 发件人, 收件人, 主题, 内容, 附件列表, 额外选项 = {}) {
  验证Nodemailer库();
  
  const 邮件选项 = {
    from: 发件人,
    to: 收件人,
    subject: 主题,
    text: typeof 内容 === 'string' ? 内容 : '',
    html: typeof 内容 === 'object' && 内容.html ? 内容.html : '',
    attachments: 附件列表,
    ...额外选项
  };
  
  return await 传输器.sendMail(邮件选项);
}

/**
 * 添加文件附件
 * @param {string} 文件路径 - 附件文件路径
 * @param {string} 文件名 - 在邮件中显示的文件名
 * @param {Object} 额外选项 - 额外的附件选项
 * @returns {Object} 附件配置对象
 */
function 添加文件附件(文件路径, 文件名, 额外选项 = {}) {
  return {
    path: 文件路径,
    filename: 文件名,
    ...额外选项
  };
}

/**
 * 添加缓冲区附件
 * @param {Buffer} 缓冲区 - 附件数据缓冲区
 * @param {string} 文件名 - 在邮件中显示的文件名
 * @param {Object} 额外选项 - 额外的附件选项
 * @returns {Object} 附件配置对象
 */
function 添加缓冲区附件(缓冲区, 文件名, 额外选项 = {}) {
  return {
    content: 缓冲区,
    filename: 文件名,
    ...额外选项
  };
}

/**
 * 添加URL附件
 * @param {string} URL - 附件URL
 * @param {string} 文件名 - 在邮件中显示的文件名
 * @param {Object} 额外选项 - 额外的附件选项
 * @returns {Object} 附件配置对象
 */
function 添加URL附件(URL, 文件名, 额外选项 = {}) {
  return {
    path: URL,
    filename: 文件名,
    ...额外选项
  };
}

/**
 * 添加嵌入图片
 * @param {string} 文件路径 - 图片文件路径
 * @param {string} 图片ID - 图片ID，用于在HTML中引用
 * @param {Object} 额外选项 - 额外的图片选项
 * @returns {Object} 图片附件配置对象
 */
function 添加嵌入图片(文件路径, 图片ID, 额外选项 = {}) {
  return {
    path: 文件路径,
    cid: 图片ID,
    ...额外选项
  };
}

/**
 * 发送批量邮件
 * @param {Object} 传输器 - 邮件传输器对象
 * @param {Array} 邮件列表 - 邮件配置数组
 * @param {Object} 通用选项 - 所有邮件共用的选项
 * @returns {Promise<Array>} 所有邮件的发送结果
 */
async function 发送批量邮件(传输器, 邮件列表, 通用选项 = {}) {
  验证Nodemailer库();
  
  const 结果 = [];
  
  for (const 单封邮件 of 邮件列表) {
    try {
      const 邮件选项 = {
        ...通用选项,
        ...单封邮件
      };
      
      const 发送结果 = await 传输器.sendMail(邮件选项);
      结果.push({ 成功: true, 结果: 发送结果, 邮件: 单封邮件 });
    } catch (错误) {
      结果.push({ 成功: false, 错误: 错误.message, 邮件: 单封邮件 });
    }
  }
  
  return 结果;
}

/**
 * 测试邮件传输器配置
 * @param {Object} 传输器 - 邮件传输器对象
 * @returns {Promise<boolean>} 测试结果
 */
async function 测试传输器(传输器) {
  验证Nodemailer库();
  
  try {
    await 传输器.verify();
    return true;
  } catch (错误) {
    console.error('传输器测试失败:', 错误.message);
    return false;
  }
}

/**
 * 创建邮件模板
 * @param {string} 模板内容 - 模板字符串，使用{变量名}格式的占位符
 * @param {Object} 数据 - 替换模板变量的数据对象
 * @returns {string} 渲染后的模板内容
 */
function 创建邮件模板(模板内容, 数据) {
  let 渲染后的内容 = 模板内容;
  
  for (const [键, 值] of Object.entries(数据)) {
    const 正则表达式 = new RegExp(`\\{${键}\\}`, 'g');
    渲染后的内容 = 渲染后的内容.replace(正则表达式, 值);
  }
  
  return 渲染后的内容;
}

/**
 * 发送带抄送和密送的邮件
 * @param {Object} 传输器 - 邮件传输器对象
 * @param {string} 发件人 - 发件人邮箱
 * @param {string|Array} 收件人 - 收件人邮箱或邮箱数组
 * @param {string} 主题 - 邮件主题
 * @param {string} 内容 - 邮件正文内容
 * @param {string|Array} 抄送人 - 抄送人邮箱或邮箱数组
 * @param {string|Array} 密送人 - 密送人邮箱或邮箱数组
 * @param {Object} 额外选项 - 额外的邮件选项
 * @returns {Promise<Object>} 发送结果
 */
async function 发送抄送邮件(传输器, 发件人, 收件人, 主题, 内容, 抄送人 = [], 密送人 = [], 额外选项 = {}) {
  验证Nodemailer库();
  
  const 邮件选项 = {
    from: 发件人,
    to: 收件人,
    subject: 主题,
    text: typeof 内容 === 'string' ? 内容 : '',
    html: typeof 内容 === 'object' && 内容.html ? 内容.html : '',
    cc: 抄送人,
    bcc: 密送人,
    ...额外选项
  };
  
  return await 传输器.sendMail(邮件选项);
}

/**
 * 创建响应式HTML邮件模板
 * @param {string} 标题 - 邮件标题
 * @param {string} 内容 - 邮件主要内容
 * @param {string} 页脚 - 邮件页脚内容
 * @returns {string} 响应式HTML邮件模板
 */
function 创建响应式HTML模板(标题, 内容, 页脚 = '此邮件由系统自动发送，请不要直接回复') {
  return `
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>${标题}</title>
      <style>
        body {
          font-family: Arial, sans-serif;
          line-height: 1.6;
          color: #333;
          max-width: 600px;
          margin: 0 auto;
          padding: 20px;
        }
        .container {
          background-color: #f9f9f9;
          padding: 20px;
          border-radius: 8px;
          box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        h1 {
          color: #2c3e50;
        }
        .footer {
          margin-top: 30px;
          padding-top: 20px;
          border-top: 1px solid #eee;
          font-size: 12px;
          color: #7f8c8d;
        }
      </style>
    </head>
    <body>
      <div class="container">
        <h1>${标题}</h1>
        <div class="content">${内容}</div>
        <div class="footer">${页脚}</div>
      </div>
    </body>
    </html>
  `;
}

/**
 * 设置邮件优先级
 * @param {Object} 邮件选项 - 邮件选项对象
 * @param {string} 优先级 - 优先级: 'high', 'normal', 'low'
 * @returns {Object} 更新后的邮件选项
 */
function 设置邮件优先级(邮件选项, 优先级 = 'normal') {
  const 优先级映射 = {
    high: '1',
    normal: '3',
    low: '5'
  };
  
  return {
    ...邮件选项,
    priority: 优先级,
    'X-Priority': 优先级映射[优先级] || '3'
  };
}

/**
 * 创建确认邮件
 * @param {string} 用户名 - 收件人用户名
 * @param {string} 确认链接 - 确认操作的链接
 * @param {string} 操作类型 - 确认操作的类型描述
 * @returns {string} 确认邮件HTML内容
 */
function 创建确认邮件模板(用户名, 确认链接, 操作类型 = '账户验证') {
  return 创建响应式HTML模板(
    `${操作类型}确认`,
    `
      <p>亲爱的 ${用户名}：</p>
      <p>感谢您的注册！请点击下方按钮完成${操作类型}。</p>
      <p style="text-align: center;">
        <a href="${确认链接}" style="
          display: inline-block;
          background-color: #3498db;
          color: white;
          padding: 10px 20px;
          text-decoration: none;
          border-radius: 5px;
          margin: 15px 0;
        ">确认${操作类型}</a>
      </p>
      <p>如果按钮无法点击，请复制以下链接到浏览器中打开：</p>
      <p><a href="${确认链接}">${确认链接}</a></p>
      <p>此链接将在24小时后过期。</p>
    `
  );
}

/**
 * 创建密码重置邮件
 * @param {string} 用户名 - 收件人用户名
 * @param {string} 重置链接 - 密码重置链接
 * @returns {string} 密码重置邮件HTML内容
 */
function 创建密码重置邮件(用户名, 重置链接) {
  return 创建确认邮件模板(用户名, 重置链接, '密码重置');
}

/**
 * 创建HTML表格邮件
 * @param {string} 标题 - 邮件标题
 * @param {Array} 表头 - 表头数组
 * @param {Array} 数据行 - 数据行二维数组
 * @param {Object} 样式选项 - 表格样式选项
 * @returns {string} 表格邮件HTML内容
 */
function 创建表格邮件(标题, 表头, 数据行, 样式选项 = {}) {
  const { 表头背景色 = '#f2f2f2', 表格边框色 = '#ddd' } = 样式选项;
  
  let 表格HTML = `
    <table border="1" cellpadding="10" cellspacing="0" style="width: 100%; border-collapse: collapse; border-color: ${表格边框色};">
      <thead>
        <tr>
  `;
  
  // 添加表头
  for (const 列名 of 表头) {
    表格HTML += `
          <th style="background-color: ${表头背景色}; text-align: left;">${列名}</th>
    `;
  }
  
  表格HTML += `
        </tr>
      </thead>
      <tbody>
  `;
  
  // 添加数据行
  for (const 行 of 数据行) {
    表格HTML += `
        <tr>
    `;
    
    for (const 单元格 of 行) {
      表格HTML += `
          <td>${单元格}</td>
      `;
    }
    
    表格HTML += `
        </tr>
    `;
  }
  
  表格HTML += `
      </tbody>
    </table>
  `;
  
  return 创建响应式HTML模板(标题, 表格HTML);
}

/**
 * 关闭邮件传输器连接池
 * @param {Object} 传输器 - 邮件传输器对象
 * @returns {Promise<void>}
 */
async function 关闭传输器(传输器) {
  验证Nodemailer库();
  
  try {
    if (传输器 && typeof 传输器.close === 'function') {
      await 传输器.close();
    }
  } catch (错误) {
    console.error('关闭传输器时出错:', 错误.message);
    throw 错误;
  }
}

// 导出API
module.exports = {
  // 传输器创建
  创建SMTP传输器,
  创建Gmail传输器,
  创建QQ邮箱传输器,
  创建163邮箱传输器,
  创建Outlook传输器,
  测试传输器,
  关闭传输器,
  
  // 邮件发送
  发送文本邮件,
  发送HTML邮件,
  发送带附件邮件,
  发送抄送邮件,
  发送批量邮件,
  
  // 附件处理
  添加文件附件,
  添加缓冲区附件,
  添加URL附件,
  添加嵌入图片,
  
  // 邮件模板
  创建邮件模板,
  创建响应式HTML模板,
  创建确认邮件模板,
  创建密码重置邮件,
  创建表格邮件,
  
  // 邮件配置
  设置邮件优先级,
  
  // 获取原始库引用
  获取原始Nodemailer: () => nodemailer
};
